#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include "EstructurasFS.h"
// #include "FuncionesFatAuxiliares.h"

//VARIABLES
bootSector bootSec;

//MIENTRAS RECORRE TABLA FAT CUENTRA ENTRADAS LIBRES (CLUSTERS LIBRES)
int fat_ClusterLibres(int *vectorFat) {
	long clusterLibres;
	long pos;
	pos = 0;
	clusterLibres = 0;
	while (pos<=131071)
	{
		    if ((int) vectorFat[pos] == fat_ClusterLibre)
	    	   {clusterLibres = clusterLibres + 1;
	    	    				}

	    	    		pos = pos + 1;
	    	    	}

	  return clusterLibres;
      }

//OBTENER CANTIDAD CLUSTER USADOS
uint32_t fat_cantidadClusterUsados(int* vectorFat){

	    uint32_t i;
        uint32_t cantidad = 0;
        for(i=0;i<(bootSec.Boot_TotalSectoresFat20 / bootSec.Boot_SectoresPorCluster);i++){
                if(vectorFat[i]!=fat_ClusterLibre) cantidad++;
        }
        return cantidad;
}

//DADO UN NUMERO DE CLUSTER DEVUELVE EL SERCTOR DONDE COMIENZA
int fat_SectorComienzoCluster(short int secReser, char cantFat,
		int sectPorFat, long numeroCluster, char sectPorCluster)
      {
		return secReser+cantFat*sectPorFat+((numeroCluster-2)*sectPorCluster);
      }

//LEE EL ARCHIVO CONFIGURACION DEL PROCESO FS
int LeerArchivoConfig (char * linea) {
	FILE *cfg;
	uint16_t i;
	uint16_t cant;

		if ((cfg = fopen("FSConfig.cfg", "r")) != NULL){

			while (! feof(cfg))
					{
						fscanf(cfg, "%s", linea);

					}
				return 1;
		}
		return 0;
}

//DADO UN NUMERO DE ENTRADA FAT (NUMERO CLUSTER) DEVUELVE PROXIMA ENTRADA FAT LIBRE (CLUSTER LIBRE)
uint32_t fat_ObtenerProximoClusterLibre(uint32_t comienzo, int* vectorFat ){
    uint32_t i;
    for (i = comienzo; i < (bootSec.Boot_TotalSectoresFat20 / bootSec.Boot_SectoresPorCluster);i++)
    {
            if (vectorFat[i] == fat_ClusterLibre)
                    return i;
    }
    return 0;
}

//DADO UN NUMERO CLUSTER DEVUELVE EL SECTOR EN QUE ESTA SU FAT
uint32_t fat_obtnerSectorEntradaFAT(uint32_t cluster){
        uint32_t numSecFAT = bootSec.Boot_ReservedSectorCount + (cluster * 4 / bootSec.Boot_BytesPorSector);
        return numSecFAT;
}



/*
uint32_t fat_getNextCluster(uint32_t currentCluster){
        return vectorFat[currentCluster];
}

*/
/*
int8_t fat_obtenerNombreLargo(LongDir * ld){
        uint8_t i;
        uint16_t nameCharacters;

    for ( i=0 ; i<13 ; i++) {
    	nameCharacters = fat_fetchChar(ld , i);
                if (LongDir_NULL(nameCharacters) )
                        return (i + 1);
    }

    return (i + 1);
}

*/
/*
uint32_t fat_fetchChar(LongDir *LD, int8_t n) {
    int i = (n % 13);

    if ( i <= 4  ) return LD->LongDir_Name1[i];
    if ( i <= 10 ) return LD->LongDir_Name2[i-5];
    return LD->LongDir_Name3[i-11];
}

*/

